package greetings

import "fmt"

// CreateArray var 数组变量名 [元素数量]Type
func CreateArray() [4]int {

	var arr [4]int = [4]int{1, 2, 3, 100}
	arr2 := [...]int{1, 2, 3, 100}

	//数组长度
	fmt.Println(len(arr2))

	//遍历数组
	for i, v := range arr {
		fmt.Println("i is :", i, " v is :", v)
	}

	//不管索引
	for _, v := range arr {
		fmt.Println(" v is :", v)
	}

	//传统的for循环
	//var i int
	fmt.Println("传统的for循环遍历。。。。。")
	for i := 0; i < len(arr); i++ {
		fmt.Println(arr[i])
	}

	//修改某个值
	arr[0] = 10000
	fmt.Println(arr[0])

	return arr
}

// SliceDemo 切片代码例子
func SliceDemo1() {

	//3种声明切片方法
	//var slice0 [] int
	//var slice1 []int = make([]int, len)
	//slice2 := make([]int, len)

	//一共有3个参数，类型、长度、容量
	//var slice1 []int = make([]int, len,cap)

	//来个普通的数组
	arr := [...]int{1, 2, 3, 100, 200, 345}
	s := arr[:]
	fmt.Println(s)

	//从2到3 左闭右开 包含索引2的值 不包含索引3的值
	//这东西和substring差不多，用过Java的都知道，和python的切片也差不多
	s = arr[2:3]
	fmt.Println(s)

	s = arr[2:]
	s = arr[:3]

	fmt.Println(s)
	//cap是切片最长可以到多少，由此可见切片肯定是保留了原始的数组信息的
	//大概率也是写时复制的原理
	fmt.Println(len(s), cap(s))
	fmt.Println(len(arr), cap(arr))

	var numbers []int
	fmt.Println("空的切片：", numbers)

	/* 允许追加空切片 */
	numbers = append(numbers, 0)
	fmt.Println("允许追加空切片", numbers)

	/* 向切片添加一个元素 */
	numbers = append(numbers, 1)
	fmt.Println("向切片添加一个元素", numbers)

	/* 同时添加多个元素 */
	numbers = append(numbers, 2, 3, 4)
	fmt.Println("同时添加多个元素", numbers)

	/* 创建切片 numbers1 是之前切片的两倍容量*/
	numbers1 := make([]int, len(numbers), (cap(numbers))*2)

	/* 拷贝 numbers 的内容到 numbers1 */
	copy(numbers1, numbers)
	fmt.Println(numbers1, numbers)
}
